public class FibonacciNumber {
    /*
    * 509. 斐波那契数
    * 斐波那契数 （通常用 F(n) 表示）形成的序列称为 斐波那契数列 。
    * 该数列由 0 和 1 开始，后面的每一项数字都是前面两项数字的和。也就是：
    * F(0) = 0，F(1) = 1
    * F(n) = F(n - 1) + F(n - 2)，其中 n > 1
    * 给定 n ，请计算 F(n) 。
    * */
    public static void main(String[] args){

    }

    // 我的想法：经典题目，当然递归能做，但是在学动态规划
    // 用动规来做
    public int mySolution(int n){
        if(n < 2)
            return n;
        // 因为要存放第n个数
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }

    // 上面的数组其实由很多空间是不用的，我们可以节省一下
    public int mySolution2(int n){
        if(n < 2)
            return n;
        // 因为我们每次只需要n-1 和 n-2 所以只要两个数
        int res = 0;
        int a = 1;
        int b = 0;
        for (int i = 2; i <= n; i++) {
            res = a + b;
            b = a;
            a = res;
        }
        return res;
    }
}